#include <stdio.h>
#include <iostream>

//当子进程终止时，系统会向父进程发送 SIGCHLD 信号，触发这个处理函数。
void sigchldHandler(int sig)
{
    LOG_INFO("Received SIGCHLD signal");
    // 回收所有终止的子进程
    while (waitpid(-1, NULL, WNOHANG) > 0);
}
//// 当子进程终止时：
// 1. 子进程变为僵尸状态（Zombie）
// 2. 系统保留进程表项直到父进程调用wait/waitpid
// 3. 如果不处理，僵尸进程会占用系统资源

/**
// 如果不处理SIGCHLD，子进程会变成僵尸进程
pid_t pid = fork();
if (pid == 0) {
    // 子进程工作
    exit(0);
}
// 父进程如果不调用wait/waitpid，子进程会成为僵尸进程
//  */
int main()
{
    // 设置SIGCHLD信号处理函数
    struct sigaction sa;
    sa.sa_handler = sigchldHandler;
    sigemptyset(&sa.sa_mask);
    // SA_NOCLDSTOP:减少不必要的信号处理,只关注子进程的退出状态,
    // SA_RESTART:某信号中断了进程的某个系统调用，则系统自动启动该系统调用
    sa.sa_flags = SA_NOCLDSTOP | SA_RESTART;
    if (sigaction(SIGCHLD, &sa, NULL) == -1) {
        printf("sigaction SIGCHLD failed");
    }



}